package edu.amm.neur;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * Файловый ввод-вывод для массивов.
 * 
 * @author Иванов Илья
 * @since 2013-04-27
 *
 */
public class ArraysIO {
	
	/**
	 * Записывает булевский массив в файл по правилу.
	 * ложному значению ставится в соответствие байт 0x00,
	 * истинному значению ставится в соответствие байт 0x01.
	 * Если файл с заданным именем уже существует, он будет перезаписан.
	 * @param array Булевский массив.
	 * @param file Файл для записи.
	 * @return <code>true</code>, если запись прошла успешно.
	 */
	public static boolean write(boolean[] array, File file) {
		if (array == null || file == null)
			return false;
		
		try (BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(file))) {
			for (boolean bool : array)
				out.write((byte) (bool ? 0x01 : 0x00));
		} catch (IOException e) {
			return false;
		}
		
		return true;
	}
	
	/**
	 * Читает из файла булевский массив.
	 * Каждому байту 0x00 ставится в соответствие ложное значение.
	 * Остальным байтам ставится в соответствие истинное значение.
	 * @param file Файла для чтения.
	 * @return Прочитанный массив или <code>null</code>, если возникла ошибка при чтении.
	 */
	public static boolean[] readBooleanArray(File file) {
		if (file == null)
			return null;
		
		List<Boolean> bools = new ArrayList<>();
		try (BufferedInputStream in = new BufferedInputStream(new FileInputStream(file))) {
			int b;
			while ((b = in.read()) != -1)
				bools.add(b == 0 ? false : true);
		} catch (IOException e) {
			return null;
		}
		
		boolean[] array = new boolean[bools.size()];
		for (int i = 0; i < array.length; i++)
			array[i] = bools.get(i);
		
		return array;
	}
}